package com.linyaonan.leetcode.easy._541;

/**
 *
 * 给定一个字符串和一个整数 k，你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符，则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符，则反转前 k 个字符，并将剩余的字符保持原样。
 *
 * 示例:
 *
 * 输入: s = "abcdefg", k = 2
 * 输出: "bacdfeg"
 * 要求:
 *
 * 该字符串只包含小写的英文字母。
 * 给定字符串的长度和 k 在[1, 10000]范围内。
 *
 *
 * @author: Lin
 * @date: 2020/1/1
 */
public class ReverseStringII {

    public String reverseStr(String s, int k) {
        StringBuilder result = new StringBuilder();
        int length = s.length();
        int p = length / (2 * k);
        for (int i = 0; i < p; i++) {
            String sb = s.substring(i * (2 * k), (i + 1) * (2 * k));
            StringBuilder re = twoK(sb, k);
            result.append(re);
        }
        int t = p * 2 * k;
        int other = length - t;
        String otherStr = s.substring(t);
        StringBuilder end;
        if (other >= k) {
            end = twoK(otherStr, k);
        } else {
            end = oneK(otherStr);
        }
        result.append(end);
        return result.toString();
    }

    /**
     * 满2k或者2k-k之间的情况
     * @param s
     * @return
     */
    private StringBuilder twoK(String s, int k) {
        StringBuilder sb = new StringBuilder();
        String start = s.substring(0, k);
        String end = s.substring(k);
        return sb.append(start).reverse().append(end);
    }

    /**
     * 不足k的情况
     * @param s
     * @return
     */
    private StringBuilder oneK(String s) {
        StringBuilder sb = new StringBuilder();
        return sb.append(s).reverse();
    }
}
